package com.ai.vr.service;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

/**
 *  机器人控制类
 * @author houwenpeng
 */
public class RobotController {

    private static final int MAX_RECONNECT_TRIES = 3;  // 最大重连尝试次数
    private Socket socket;  // 用于连接机器人的 socket
    private OutputStream outputStream;  // 用于发送控制指令的输出流
    private static String robotIp = "0.0.0.0"; // 默认 IP 地址
    private static int port = 8888; // 默认端口号

    /**
     * 构造函数，初始化 socket 和 outputStream
     * @param ip  机器人的 IP 地址
     * @param port  机器人的端口号
     * @throws IOException
     * @throws InterruptedException
     */
    public RobotController(String ip, int port) throws IOException, InterruptedException {
        this.robotIp = ip;
        this.port = port;
        reconnect();
    }

    /**
     * 发送控制指令
     * @param command    控制指令
     * @throws IOException
     * @throws InterruptedException
     */
    public void sendCommand(String command) throws IOException, InterruptedException {
        try {
            // 如果连接关闭或断开，尝试重连
            if (socket.isClosed() || !socket.isConnected()) {
                reconnect();
            }
            // 发送控制指令
            outputStream.write(command.getBytes());
            // 刷新输出流，确保指令立即发送
            outputStream.flush();
        } catch (IOException | InterruptedException e) {
            System.err.println("发送控制指令失败: " + e.getMessage());
            // 连接错误处理逻辑
            reconnect();
        }
    }


    /**
     * 重连的方法
     * @throws IOException
     * @throws InterruptedException
     */
    private void reconnect() throws IOException, InterruptedException {
        int tryCount = 0;
        // 尝试重连，最多尝试 MAX_RECONNECT_TRIES 次
        while (tryCount < MAX_RECONNECT_TRIES) {
            try {
                // 建立连接
                socket = new Socket(robotIp, port);
                // 获取输出流
                outputStream = socket.getOutputStream();
                System.out.println("已重新连接到赛博格机器人");
                return;
            } catch (IOException e) {
                // 连接错误处理逻辑
                tryCount++;
                System.err.println("连接赛博格机器人失败，正在重试...");
                Thread.sleep(2000);  // 每次重连等待 2 秒
            }
        }
        throw new IOException("无法连接到赛博格机器人,请检查链接信息是否准确: 【 RobotIp: "+robotIp+ " 】 【 RobotPort:"+port+"】 重试次数已超过限制~~");
    }

    /**
     * 关闭连接
     * @throws IOException
     */
    public void close() throws IOException {
        if (socket != null) {
            outputStream.close();
            socket.close();
        }
    }
}